display.ts ➔ updateDisplay   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
import { state } from '../../bip39';
2
import { elements } from '../../bip39';
3
import { getAllDisplayData } from '../application/displayService';
4
5
export function updateDisplay(): void {
6
  const displayData = getAllDisplayData(state.boxes);
7
8
  updateBoxStates(displayData.boxes);
9
  updateBinaryDisplay(displayData.binary);
10
  updateWordDisplay(displayData.word);
11
  syncWordInputFromBoxes();
12
}
13
14
// Callback for syncing word input (set by wordInput module to avoid circular dependency)
15
let syncWordInputCallback: (() => void) | null = null;
16
let announcementTimeout: NodeJS.Timeout | null = null;
17
18
export function setSyncWordInputCallback(callback: () => void): void {
19
  syncWordInputCallback = callback;
20
}
21
22
function syncWordInputFromBoxes(): void {
23
  if (syncWordInputCallback) {
24
    syncWordInputCallback();
25
  }
26
}
27
28
function updateBoxStates(boxesData: Array<{ isActive: boolean; isDisabled: boolean; ariaPressed: string }>): void {
29
  const boxElements = elements.grid.querySelectorAll('.box');
30
31
  boxElements.forEach((box, index) => {
32
    const htmlBox = box as HTMLButtonElement;
33
    const data = boxesData[index];
34
35
    // Update active state
36
    htmlBox.classList.toggle('active', data.isActive);
37
    htmlBox.setAttribute('aria-pressed', data.ariaPressed);
38
39
    // Update disabled state
40
    htmlBox.classList.toggle('disabled', data.isDisabled);
41
    htmlBox.dataset.isDisabled = data.isDisabled.toString();
42
    htmlBox.setAttribute('aria-disabled', data.isDisabled.toString());
43
  });
44
}
45
46
function updateBinaryDisplay(binaryData: { binaryString: string }): void {
47
  elements.binary.textContent = binaryData.binaryString;
48
}
49
50
function updateWordDisplay(wordData: { indexText: string; announcement: string }): void {
51
  elements.index.textContent = wordData.indexText;
52
  announceToScreenReader(wordData.announcement);
53
}
54
55
function announceToScreenReader(message: string): void {
56
  const announcer = document.getElementById('sr-announcements');
57
  if (announcer) {
58
    // Clear existing timeout
59
    if (announcementTimeout) {
60
      clearTimeout(announcementTimeout);
61
    }
62
63
    announcer.textContent = message;
64
65
    // Clear after a short delay to allow for new announcements
66
    announcementTimeout = setTimeout(() => {
67
      announcer.textContent = '';
68
    }, 1000);
69
  }
70
}
71